settings: Store style cascade in settings object
authorBenjamin Otte <otte@redhat.com>
Thu, 20 Feb 2014 01:02:05 +0000 (02:02 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 20 Feb 2014 01:10:07 +0000 (02:10 +0100)
This ensures that the initialization for the CSS theme happens when the
style cascade gets queried.

https://bugzilla.redhat.com/show_bug.cgi?id=1064922
https://bugzilla.mozilla.org/show_bug.cgi?id=972382

gtk/gtksettings.c
gtk/gtksettingsprivate.h
gtk/gtkstylecascade.c

index 032104708637e7e51898857129ee41754fc450fa..5bfb60c104d0fcff5c547fa15cfb000b7917d57a 100644 (file)
@@ -114,6 +114,7 @@ struct _GtkSettingsPrivate
   GData *queued_settings;      /* of type GtkSettingsValue* */
   GtkSettingsPropertyValue *property_values;
   GdkScreen *screen;
+  GtkStyleCascade *style_cascade;
   GtkCssProvider *theme_provider;
   GtkCssProvider *key_theme_provider;
 };
@@ -290,6 +291,7 @@ gtk_settings_init (GtkSettings *settings)
   g_datalist_init (&priv->queued_settings);
   object_list = g_slist_prepend (object_list, settings);
 
+  priv->style_cascade = _gtk_style_cascade_new ();
   priv->theme_provider = gtk_css_provider_new ();
 
   /* build up property array for all yet existing properties and queue
@@ -1675,16 +1677,24 @@ gtk_settings_finalize (GObject *object)
 
   settings_update_provider (priv->screen, &priv->theme_provider, NULL);
   settings_update_provider (priv->screen, &priv->key_theme_provider, NULL);
+  g_clear_object (&priv->style_cascade);
 
   G_OBJECT_CLASS (gtk_settings_parent_class)->finalize (object);
 }
 
+GtkStyleCascade *
+_gtk_settings_get_style_cascade (GtkSettings *settings)
+{
+  g_return_val_if_fail (GTK_IS_SETTINGS (settings), NULL);
+
+  return settings->priv->style_cascade;
+}
+
 static void
 settings_init_style (GtkSettings *settings)
 {
   static GtkCssProvider *css_provider = NULL;
-
-  GdkScreen *screen = settings->priv->screen;
+  GtkSettingsPrivate *priv = settings->priv;
 
   /* Add provider for user file */
   if (G_UNLIKELY (!css_provider))
@@ -1704,17 +1714,17 @@ settings_init_style (GtkSettings *settings)
       g_free (css_path);
     }
 
-  gtk_style_context_add_provider_for_screen (screen,
-                                             GTK_STYLE_PROVIDER (css_provider),
-                                             GTK_STYLE_PROVIDER_PRIORITY_USER);
+  _gtk_style_cascade_add_provider (priv->style_cascade,
+                                   GTK_STYLE_PROVIDER (css_provider),
+                                   GTK_STYLE_PROVIDER_PRIORITY_USER);
 
-  gtk_style_context_add_provider_for_screen (screen,
-                                             GTK_STYLE_PROVIDER (settings),
-                                             GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
+  _gtk_style_cascade_add_provider (priv->style_cascade,
+                                   GTK_STYLE_PROVIDER (settings),
+                                   GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
 
-  gtk_style_context_add_provider_for_screen (screen,
-                                             GTK_STYLE_PROVIDER (settings->priv->theme_provider),
-                                             GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
+  _gtk_style_cascade_add_provider (priv->style_cascade,
+                                   GTK_STYLE_PROVIDER (settings->priv->theme_provider),
+                                   GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
 
   settings_update_theme (settings);
   settings_update_key_theme (settings);
index bb21d9d5ab8cd9207c30cf4abfb72ead8488e958..df42013ad8835ef7a8ed447713cbe87b35f76b19 100644 (file)
@@ -19,6 +19,7 @@
 #define __GTK_SETTINGS_PRIVATE_H__
 
 #include <gtk/gtksettings.h>
+#include "gtkstylecascadeprivate.h"
 
 G_BEGIN_DECLS
 
@@ -36,6 +37,7 @@ gboolean            _gtk_settings_parse_convert              (GtkRcPropertyParse
                                                               GParamSpec             *pspec,
                                                               GValue                 *dest_value);
 GdkScreen          *_gtk_settings_get_screen                 (GtkSettings            *settings);
+GtkStyleCascade    *_gtk_settings_get_style_cascade          (GtkSettings            *settings);
 
 
 G_END_DECLS
index ea63fc86f6637c56c2a05f3e0cf29150ebfe0f38..7f281b399b8a007ada6a3abbaf1a33ee75609569 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "gtkstyleprovider.h"
 #include "gtkstyleproviderprivate.h"
+#include "gtksettingsprivate.h"
 
 typedef struct _GtkStyleCascadeIter GtkStyleCascadeIter;
 typedef struct _GtkStyleProviderData GtkStyleProviderData;
@@ -312,22 +313,9 @@ _gtk_style_cascade_new (void)
 GtkStyleCascade *
 _gtk_style_cascade_get_for_screen (GdkScreen *screen)
 {
-  GtkStyleCascade *cascade;
-  static GQuark quark = 0;
-
   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
 
-  if (G_UNLIKELY (!quark))
-    quark = g_quark_from_static_string ("gtk-style-cascade");
-
-  cascade = g_object_get_qdata (G_OBJECT (screen), quark);
-  if (cascade == NULL)
-    {
-      cascade = _gtk_style_cascade_new ();
-      g_object_set_qdata_full (G_OBJECT (screen), quark, cascade, g_object_unref);
-    }
-
-  return cascade;
+  return _gtk_settings_get_style_cascade (gtk_settings_get_for_screen (screen));
 }
 
 void